#include "Hardware/Interrupt.h"
#include "Hardware/Info.h"
#include "Hardware/Timer.h"
#include <intrins.h>
#include <string.h>

//方式1 baudrate=((2^SMOD)/32) * T1溢出率
//T1溢出率= fosc/(12*(256-TH1))
//TH1=256-(fosc*2^SMOD)/(baudrate*12*32);

#define BAUDRATE (9600U) //波特率 9600bit/s
#define TH1_VALUE (256-(XTAL)/BAUDRATE/12/32)

uint8 count;

void serialPortInit()    
{
	SM0=0; /*设置URAT的工作方式,8位,波特率可变*/
	SM1=1;
	REN=0; /*禁止接收*/
	
	Timer1Init(1,TH1_VALUE,TH1_VALUE);  /*定时器1工作在8位自动重装模式*/
	
	OpenINT(); /*总中断开关*/
	OpenUartINT(); /*开启串行口中断*/
}

void serialPortUninit()  
{
	ClearTimer1();
	CloseINT();
	CloseUartINT();
}

void SerialSendByte(byte d)
{
	serialPortInit();
	count=0;
	SBUF=d;
	while(count!=1)
	{
		_nop_();
	}
	serialPortUninit();
}

void SerialSendBytes(const byte _data[],uint8 _size)
{
	uint8 i;
	serialPortInit();
	count=0;
	for(i=0;i<_size;++i)
	{
		SBUF=_data[i];
		while(count!=i+1)
		{
			_nop_();
		}
	}
		
	serialPortUninit();
}

void SerialSendNumber(uint16 number)
{
	byte dat[sizeof(uint16)];
	uint8 i;
	serialPortInit();
	count=0;
	memcpy(dat,&number,sizeof(uint16));
	for(i=0;i<sizeof(uint16);++i)
	{	
		SBUF=dat[i];
		while(count!=i+1)
		{
			_nop_();
		}
	}
	serialPortUninit();
}

void SerialSendFloat(float number)
{
	byte dat[sizeof(float)];
	uint8 i;
	serialPortInit();
	count=0;
	memcpy(dat,&number,sizeof(float));
	for(i=0;i<sizeof(float);++i)
	{	
		SBUF=dat[i];
		while(count!=i+1)
		{
			_nop_();
		}
	}
	serialPortUninit();
}

Uart_Interrupt(sendProc)
{
	if(TI)
	{
		TI=0;
		++count;
	}
}